﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;

namespace csharpcore7_ch14_ConcurrencyAndAsynchrony
{
    class chapt14_2_4LocalStatuesAnd_ShareStatues
    {
        #region CLR为每一个线程分配了独立的内存栈，从而保证了局部变量的隔离
        static void _Main()
        {
            new Thread(Go).Start(); //在新线程中调用Go方法
            Go();                   //在主线程中调用Go方法
        }
        static void Go()
        {
            //声明一个本地变量 cycles
            for (int cycles = 0; cycles < 5; cycles++) Console.Write('?');
        }
        #endregion


        #region 如果不同的线程有同一个对象的引用，则这些线程之间就共享了数据
        static void __Main()
        {
            chapt14_2_4LocalStatuesAnd_ShareStatues tt = new chapt14_2_4LocalStatuesAnd_ShareStatues();//创建一个通用的实例
            new Thread(tt.Go1).Start();
            tt.Go1();
        }

        bool _done = false; //共享数据
         void Go1()
        {
            if (!_done) { _done = true;Console.WriteLine("Done"); }
        }
        #endregion


        #region 编译器会将Lambda表达式捕获的局部变量或匿名委托转换为字段，因此它们也可以被共享
        static void ___Main()
        {
            bool done = false;
            ThreadStart action = () =>
            {
                if (!done) { done = true; Console.WriteLine("Done"); }
            };

            new Thread(action).Start();
            action();
        }
        #endregion

        #region 静态字段提供了另种在线程之间共享变量的方法
        static bool _done_s;    //静态字段在同一应用程序域中被所有的线程共享

        static void _____Main()
        {
            new Thread(Go2).Start();
            Go2();
        }
        static void Go2()
        {
           // if (!_done_s) { _done_s = true; Console.WriteLine("Done"); }

        //当一个线程在判断if语句的时候，另一个线程有可能在done设置为true之前就已经开始执行WriteLine语句了
          if (!_done_s) { Console.WriteLine("Done"); _done_s = true; }
        }
        #endregion
    }
}
